
package redeS.arquitetura;

import java.util.LinkedList;

import peersim.core.Protocol;
import peersim.core.Linkable;
import peersim.core.Node;

/**
 * Protocolo Gnutella.
 * Essa classe é um contêiner de vizinhos.
 * @author thiago-pc
 */
public class GnutellaProtocol implements Protocol, Linkable{
	
	/**
	 * Lista de nós vizinhos.
	 */
	private LinkedList<Node> neighbours;
	
	private String prefix;
	
	public GnutellaProtocol(String prefix){
		neighbours = new LinkedList<Node>();
		this.prefix = prefix;	
	}
	
	@Override
	public boolean addNeighbor(Node neighbor) {
		if(!neighbours.contains(neighbor)){
			return neighbours.add(neighbor);
		}
		else return false;
	}
	
	/**
	 * Esse método não está incluso em {@link Linkable}. O protocolo Gnutella permite que
	 * os nós se conectem de desconectem livremente.
	 * @param neighbor Vizinho que este nó não se ligará mais.
	 * @return true se removeu, false caso contrário.
	 */
	public boolean removeNeighbor(Node neighbor){
		if(neighbor==null) return false;
		return neighbours.remove(neighbor);
	}

	@Override
	public boolean contains(Node neighbor) {
		return neighbours.contains(neighbor);
	}

	@Override
	public int degree() {
		return neighbours.size();
	}

	@Override
	public Node getNeighbor(int i) {
		return neighbours.get(i);
	}

	@Override
	public void pack() {

	}

	@Override
	public void onKill() {
		neighbours = null;
	}
	
	@Override
	public Object clone(){
		return new GnutellaProtocol(prefix);
	}

}
